package com.wwdx.dao;

import org.hibernate.Session;

import java.io.Serializable;
import java.math.BigInteger;
import java.util.List;
import java.util.Map;

/**
 * 基础数据库操作类
 * 其他DAO继承此类获取常用的数据库操作方法，基本上你能用到的方法这里都有了，不需要自己建立DAO了。
 * @author liguoliang
 * @param <T> 模型
 */
public interface BaseDaoI<T> {

	/**
	 * 当前session
	 * @return Session
	 */
	Session getCurrentSession();

	/**
	 * 保存一个对象
	 * @param o 对象
	 * @return 对象的ID
	 */
	Serializable save(T o);

	/**
	 * 删除一个对象
	 * @param o 对象
	 */
	void delete(T o);

	/**
	 * 更新一个对象
	 * @param o 对象
	 */
	void update(T o);

	/**
	 * 保存或更新一个对象
	 * @param o 对象
	 */
	void saveOrUpdate(T o);

	/**
	 * 合并并保存一个对象（当一个对象处理于两种状态时用此方法处理）
	 * @param o 对象
	 */
	void merge(T o);

    /**
     * 通过主键获得对象
     * @param c 对象
     * @param id 主键
     * @return 对象
     */
	T getById(Class<T> c, Serializable id);

	/**
	 * 通过HQL语句获取一个对象
	 * @param hql HQL语句
	 * @return 对象
	 */
	T getByHql(String hql);

	/**
	 * 通过HQL语句获取一个对象
	 * @param hql HQL语句
	 * @param params 参数
	 * @return 对象
	 */
	T getByHql(String hql, Map<String, Object> params);

	/**
	 * 获得对象列表
	 * @param hql HQL语句
	 * @return 结果集
	 */
	List<T> find(String hql);

	/**
	 * 获得对象列表
	 * @param hql HQL语句
	 * @param params 参数
	 * @return 结果集
	 */
	List<T> find(String hql, Map<String, Object> params);

	/**
	 * 获得分页后的对象列表
	 * @param hql HQL语句
	 * @param page 要显示第几页
	 * @param rows 每页显示多少条
	 * @return 结果集
	 */
	List<T> find(String hql, int page, int rows);

	/**
	 * 获得分页后的对象列表
	 * @param hql HQL语句
	 * @param params 参数
	 * @param page 要显示第几页
	 * @param rows 每页显示多少条
	 * @return 结果集
	 */
	List<T> find(String hql, Map<String, Object> params, int page, int rows);

	/**
	 * 获得自定义对象列表
	 * @param hql HQL语句
	 * @return 结果集
	 */
	List get(String hql);

	/**
	 * 获得自定义对象列表
	 * @param hql HQL语句
	 * @param params 参数
	 * @return 结果集
	 */
	List get(String hql, Map<String, Object> params);

	/**
	 * 获得分页后的自定义对象列表
	 * @param hql HQL语句
	 * @param page 要显示第几页
	 * @param rows 每页显示多少条
	 * @return 结果集
	 */
	List get(String hql, int page, int rows);

	/**
	 * 获得分页后的自定义对象列表
	 * @param hql HQL语句
	 * @param params 参数
	 * @param page 要显示第几页
	 * @param rows 每页显示多少条
	 * @return 结果集
	 */
	List get(String hql, Map<String, Object> params, int page, int rows);

	/**
	 * 统计数目
	 * @param hql HQL语句(select count(*) from T)
	 * @return long
	 */
	Long count(String hql);

	/**
	 * 统计数目
	 * @param hql HQL语句(select count(*) from T where xx = :xx)
	 * @param params 参数
	 * @return long
	 */
	Long count(String hql, Map<String, Object> params);

	/**
	 * 执行一条HQL语句
	 * @param hql HQL语句
	 * @return 响应结果数目
	 */
	int executeHql(String hql);

	/**
	 * 执行一条HQL语句
	 * @param hql HQL语句
	 * @param params 参数
	 * @return 响应结果数目
	 */
	int executeHql(String hql, Map<String, Object> params);

    /**
     * 执行SQL语句
     * @param sql SQL语句
     * @return 响应行数
     */
    int executeSql(String sql);

    /**
     * 执行SQL语句
     * @param sql SQL语句
     * @param params 参数
     * @return 响应行数
     */
    int executeSql(String sql, Map<String, Object> params);

    /**
     * 统计
     * @param sql SQL语句
     * @return 数目
     */
    BigInteger countBySql(String sql);

    /**
     * 统计
     * @param sql SQL语句
     * @param params 参数
     * @return 数目
     */
    BigInteger countBySql(String sql, Map<String, Object> params);

    /**
	 * 获得结果集
	 * @param sql SQL语句
	 * @return 结果集
	 */
	List<Map> findBySql(String sql);

	/**
	 * 获得结果集
	 * @param sql SQL语句
	 * @param page 要显示第几页
	 * @param rows 每页显示多少条
	 * @return 结果集
	 */
	List<Map> findBySql(String sql, int page, int rows);

	/**
	 * 获得结果集
	 * @param sql SQL语句
	 * @param params 参数
	 * @return 结果集
	 */
	List<Map> findBySql(String sql, Map<String, Object> params);

	/**
	 * 获得结果集
	 * @param sql SQL语句
	 * @param params 参数
	 * @param page 要显示第几页
	 * @param rows 每页显示多少条
	 * @return 结果集
	 */
	List<Map> findBySql(String sql, Map<String, Object> params, int page, int rows);

    /**
     * 获得结果集
     * @param sql SQL语句
     * @param clazz 类.class
     * @return 结果集
     */
    List<T> findBySqlToListBean(String sql, Class clazz);

    /**
     * 获得结果集
     * @param sql SQL语句
     * @param clazz 类.class
     * @param page 要显示第几页
     * @param rows 每页显示多少条
     * @return 结果集
     */
    List<T> findBySqlToListBean(String sql, Class clazz, int page, int rows);

    /**
     * 获得结果集
     * @param sql SQL语句
     * @param clazz 类.class
     * @param params 参数
     * @return 结果集
     */
    List<T> findBySqlToListBean(String sql, Class clazz, Map<String, Object> params);

    /**
     * 获得结果集
     * @param sql SQL语句
     * @param clazz 类.class
     * @param params 参数
     * @param page 要显示第几页
     * @param rows 每页显示多少条
     * @return 结果集
     */
    List<T> findBySqlToListBean(String sql, Class clazz, Map<String, Object> params, int page, int rows);
}